home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
djgpp
/
clients
/
bitmap
/
bitedit.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-12
|
28KB
|
1,114 lines
/*
* $XConsortium: BitEdit.c,v 1.22 91/07/22 19:57:49 keith Exp $
*
* Copyright 1989 Massachusetts Institute of Technology
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of M.I.T. not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. M.I.T. makes no representations about the
* suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
* BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Author: Davor Matic, MIT X Consortium
*/
#include <stdio.h>
#ifdef MSDOS
#include "X11/Intrinsc.h" /* QDK 05/11/1994 10:44am. */
#else
#include "X11/Intrinsic.h"
#endif
#include <X11/StringDefs.h>
#include <X11/Xaw/Paned.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Box.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/Toggle.h>
#include <X11/Xaw/MenuButton.h>
#include <X11/Xaw/SimpleMenu.h>
#include <X11/Xaw/SmeLine.h>
#include <X11/Xaw/SmeBSB.h>
#include "Bitmap.h"
#include <X11/bitmaps/xlogo16>
static char *usage = "[-options ...] filename\n\
\n\
where options include all standard toolkit options plus:\n\
-size WIDTHxHEIGHT\n\
-sw dimension\n\
-sh dimension\n\
-gt dimension\n\
-grid, +grid\n\
-axes, +axes\n\
-dashed, +dashed\n\
-stippled, +stippled\n\
-proportional, +proportional\n\
-basename basename\n\
-dashes filename\n\
-stipple filename\n\
-hl color\n\
-fr color\n\
\n\
The default WIDTHxHEIGHT is 16x16.\n";
static XrmOptionDescRec options[] = {
{ "-axes", "*bitmap.axes", XrmoptionNoArg, "True"},
{ "+axes", "*bitmap.axes", XrmoptionNoArg, "False"},
{ "-basename", "*bitmap.basename", XrmoptionSepArg, NULL},
{ "-dashed", "*bitmap.dashed", XrmoptionNoArg, "True"},
{ "+dashed", "*bitmap.dashed", XrmoptionNoArg, "False"},
{ "-dashes", "*bitmap.dashes", XrmoptionSepArg, NULL},
{ "-fr", "*bitmap.frame", XrmoptionSepArg, NULL},
{ "-gt", "*bitmap.gridTolerance",XrmoptionSepArg, NULL},
{ "-grid", "*bitmap.grid", XrmoptionNoArg, "True"},
{ "+grid", "*bitmap.grid", XrmoptionNoArg, "False"},
{ "-hl", "*bitmap.highlight", XrmoptionSepArg, NULL},
{ "-proportional","*bitmap.proportional", XrmoptionNoArg, "True"},
{ "+proportional","*bitmap.proportional", XrmoptionNoArg, "False"},
{ "-size", "*bitmap.size", XrmoptionSepArg, NULL},
{ "-sh", "*bitmap.squareHeight", XrmoptionSepArg, NULL},
{ "-sw", "*bitmap.squareWidth", XrmoptionSepArg, NULL},
{ "-stipple", "*bitmap.stipple", XrmoptionSepArg, NULL},
{ "-stippled", "*bitmap.stippled", XrmoptionNoArg, "True"},
{ "+stippled", "*bitmap.stippled", XrmoptionNoArg, "False"},
};
typedef struct {
int id;
String name;
Boolean trap;
Widget widget;
} ButtonRec;
static ButtonRec file_menu[] = {
#define New 101
{New, "new", True},
#define Load 102
{Load, "load", True},
#define Insert 103
{Insert, "insert", True},
#define Save 104
{Save, "save", True},
#define SaveAs 105
{SaveAs, "saveAs", True},
#define Resize 106
{Resize, "resize", True},
#define Rescale 107
{Rescale, "rescale", True},
#define Filename 108
{Filename, "filename", True},
#define Basename 109
{Basename, "basename", True},
#define Dummy -1
{Dummy, "line", False},
#define Quit 110
{Quit, "quit", True},
};
static ButtonRec edit_menu[] = {
#define Image 201
{Image, "image", True},
#define Grid 203
{Grid, "grid", True},
#define Dashed 204
{Dashed, "dashed", True},
#define Axes 205
{Axes, "axes", True},
#define Stippled 206
{Stippled, "stippled", True},
#define Proportional 207
{Proportional, "proportional", True},
#define Zoom 208
{Zoom, "zoom", True},
/* Dummy */
{Dummy, "line", False},
#define Cut 209
{Cut, "cut", True},
#define Copy 210
{Copy, "copy", True},
#define Paste 211
{Paste, "paste", True},
};
static ButtonRec buttons[] = {
/*#define Clear 1*/
{Clear, "clear", False},
/*#define Set 2*/
{Set, "set", False},
/*#define Invert 3*/
{Invert, "invert", False},
#define Mark 26
{Mark, "mark", True},
#define Unmark 27
{Unmark, "unmark", False},
#define CopyImm 4
{CopyImm, "copy", True},
#define MoveImm 5
{MoveImm, "move", True},
#define FlipHoriz 6
{FlipHoriz, "flipHoriz", False},
#define Up 7
{Up, "up", False},
#define FlipVert 8
{FlipVert, "flipVert", False},
#define Left 9
{Left, "left", False},
#define Fold 10
{Fold, "fold", False},
#define Right 11
{Right, "right", False},
#define RotateLeft 12
{RotateLeft, "rotateLeft", False},
#define Down 13
{Down, "down", False},
#define RotateRight 14
{RotateRight, "rotateRight", False},
#define Point 15
{Point, "point", True},
#define Curve 16
{Curve, "curve", True},
#define Line 17
{Line, "line", True},
#define Rectangle 18
{Rectangle, "rectangle", True},
#define FilledRectangle 19
{FilledRectangle, "filledRectangle", True},
#define Circle 20
{Circle, "circle", True},
#define FilledCircle 21
{FilledCircle, "filledCircle", True},
#define FloodFill 22
{FloodFill, "floodFill", True},
#define SetHotSpot 23
{SetHotSpot, "setHotSpot", True},
#define ClearHotSpot 24
{ClearHotSpot, "clearHotSpot", False},
#define Undo 25
{Undo, "undo", False},
};
#include "Dialog.h"
Widget
top_widget,
parent_widget,
formy_widget,
fileButton_widget, fileMenu_widget,
editButton_widget, editMenu_widget,
status_widget,
pane_widget,
form_widget,
bitmap_widget,
image_shell,
box_widget,
normal_image_widget,
inverted_image_widget;
Boolean image_visible = False;
Pixmap check_mark;
Dialog input_dialog, error_dialog, qsave_dialog;
Time btime;
String filename = NULL, basename = NULL, format;
char message[80];
void FixMenu();
void SwitchImage();
void SwitchGrid();
void SwitchDashed();
void SwitchAxes();
void SwitchStippled();
void SwitchProportional();
void SwitchZoom();
void DoCut();
void DoCopy();
void DoPaste();
void DoNew();
void DoLoad();
void DoInsert();
void DoSave();
void DoSaveAs();
void DoResize();
void DoRescale();
void DoFilename();
void DoBasename();
void DoQuit();
static XtActionsRec actions_table[] = {
{"fix-menu", FixMenu},
{"switch-image", SwitchImage},
{"switch-grid", SwitchGrid},
{"switch-dashed", SwitchDashed},
{"switch-axes", SwitchAxes},
{"switch-stippled", SwitchStippled},
{"switch-proportional", SwitchProportional},
{"switch-zoom", SwitchZoom},
{"do-cut", DoCut},
{"do-copy", DoCopy},
{"do-paste", DoPaste},
{"do-new", DoNew},
{"do-load", DoLoad},
{"do-insert", DoInsert},
{"do-save", DoSave},
{"do-save-as", DoSaveAs},
{"do-resize", DoResize},
{"do-rescale", DoRescale},
{"do-filename", DoFilename},
{"do-basename", DoBasename},
{"do-quit", DoQuit}
};
static Atom wm_delete_window;
void FixImage()
{
Pixmap old_image, image;
int n;
Arg wargs[2];
if (!image_visible) return;
n=0;
XtSetArg(wargs[n], XtNbitmap, &old_image); n++;
XtGetValues(normal_image_widget, wargs, n);
image = BWGetUnzoomedPixmap(bitmap_widget);
n=0;
XtSetArg(wargs[n], XtNbitmap, image); n++;
XtSetValues(normal_image_widget, wargs, n);
XtSetValues(inverted_image_widget, wargs, n);
if (old_image != XtUnspecifiedPixmap)
XFreePixmap(XtDisplay(bitmap_widget), old_image);
}
FixStatus()
{
int n;
Arg wargs[2];
String str, label;
str = BWUnparseStatus(bitmap_widget);
n=0;
XtSetArg(wargs[n], XtNlabel, &label); n++;
XtGetValues(status_widget, wargs, n);
if (strcmp(str, label)) {
n = 0;
XtSetArg(wargs[n], XtNlabel, str); n++;
XtSetValues(status_widget, wargs, n);
}
/*XtFree(str); */
}
void FixUp()
{
FixImage();
FixStatus();
}
void FixEntry(w, id)
Widget w;
int *id;
{
int n;
Arg wargs[2];
Time dummy = 0;
n = 0;
switch (*id) {
case Image:
XtSetArg(wargs[n], XtNleftBitmap,
image_visible ? check_mark : None); n++;
break;
case Grid:
XtSetArg(wargs[n], XtNleftBitmap,
BWQueryGrid(bitmap_widget) ? check_mark : None); n++;
break;
case Dashed:
XtSetArg(wargs[n], XtNleftBitmap,
BWQueryDashed(bitmap_widget) ? check_mark : None); n++;
break;
case Axes:
XtSetArg(wargs[n], XtNleftBitmap,
BWQueryAxes(bitmap_widget) ? check_mark : None); n++;
break;
case Stippled:
XtSetArg(wargs[n], XtNleftBitmap,
BWQueryStippled(bitmap_widget) ? check_mark : None); n++;
break;
case Proportional:
XtSetArg(wargs[n], XtNleftBitmap,
BWQueryProportional(bitmap_widget) ? check_mark : None); n++;
break;
case Zoom:
XtSetArg(wargs[n], XtNleftBitmap,
BWQueryZooming(bitmap_widget) ? check_mark : None); n++;
break;
case Copy:
case Cut:
XtSetArg(wargs[n], XtNsensitive, BWQueryMarked(bitmap_widget)); n++;
break;
case Paste:
XtSetArg(wargs[n], XtNsensitive,
BWQuerySelection(bitmap_widget, dummy)); n++;
break;
default:
return;
}
XtSetValues(w, wargs, n);
}
/* ARGSUSED */
void FixMenu(w, event)
Widget w;
XEvent *event;
{
int i;
btime = event->xbutton.time;
for (i = 0; i < XtNumber(edit_menu); i++)
FixEntry(edit_menu[i].widget, &edit_menu[i].id);
}
static int zero = 0;
#define Plain (char *)&zero,sizeof(int)
/* ARGSUSED */
void TheCallback(w, clientData, callData)
Widget w; /* not used */
XtPointer clientData, callData;
{
int *id = (int *)clientData;
switch (*id) {
case New:
DoNew();
break;
case Load:
DoLoad();
break;
case Insert:
DoInsert();
break;
case Save:
DoSave();
break;
case SaveAs:
DoSaveAs();
break;
case Resize:
DoResize();
break;
case Rescale:
DoRescale();
break;
case Filename:
DoFilename();
break;
case Basename:
DoBasename();
break;
case Image:
SwitchImage();
break;
case Grid:
SwitchGrid();
break;
case Dashed:
SwitchDashed();
break;
case Axes:
SwitchAxes();
break;
case Stippled:
SwitchStippled();
break;
case Proportional:
SwitchProportional();
break;
case Zoom:
SwitchZoom();
break;
case Cut:
DoCut();
break;
case Copy:
DoCopy();
break;
case Paste:
DoPaste();
break;
case Clear:
BWStoreToBuffer(bitmap_widget);
BWClear(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case Set:
BWStoreToBuffer(bitmap_widget);
BWSet(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case Invert:
BWStoreToBuffer(bitmap_widget);
BWInvert(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case Mark:
BWRemoveAllRequests(bitmap_widget);
BWEngageRequest(bitmap_widget, MarkRequest, True, Plain);
break;
case Unmark:
BWUnmark(bitmap_widget);
break;
case CopyImm:
BWRemoveAllRequests(bitmap_widget);
if (BWQueryMarked(bitmap_widget)) {
BWAddRequest(bitmap_widget, MarkRequest, False, Plain);
BWEngageRequest(bitmap_widget, CopyRequest, True, Plain);
}
else {
BWEngageRequest(bitmap_widget, MarkRequest, False, Plain);
BWAddRequest(bitmap_widget, CopyRequest, True, Plain);
}
break;
case MoveImm:
BWRemoveAllRequests(bitmap_widget);
if (BWQueryMarked(bitmap_widget)) {
BWAddRequest(bitmap_widget, MarkRequest, False, Plain);
BWEngageRequest(bitmap_widget, MoveRequest, True, Plain);
}
else {
BWEngageRequest(bitmap_widget, MarkRequest, False, Plain);
BWAddRequest(bitmap_widget, MoveRequest, True, Plain);
}
break;
case Up:
BWStoreToBuffer(bitmap_widget);
BWUp(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case Down:
BWStoreToBuffer(bitmap_widget);
BWDown(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case Left:
BWStoreToBuffer(bitmap_widget);
BWLeft(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case Right:
BWStoreToBuffer(bitmap_widget);
BWRight(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case Fold:
BWStoreToBuffer(bitmap_widget);
BWFold(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case FlipHoriz:
BWStoreToBuffer(bitmap_widget);
BWFlipHoriz(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case FlipVert:
BWStoreToBuffer(bitmap_widget);
BWFlipVert(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case RotateRight:
BWStoreToBuffer(bitmap_widget);
BWRotateRight(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case RotateLeft:
BWStoreToBuffer(bitmap_widget);
BWRotateLeft(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case Point:
BWRemoveAllRequests(bitmap_widget);
BWEngageRequest(bitmap_widget, PointRequest, True, Plain);
break;
case Curve:
BWRemoveAllRequests(bitmap_widget);
BWEngageRequest(bitmap_widget, CurveRequest, True, Plain);
break;
case Line:
BWRemoveAllRequests(bitmap_widget);
BWEngageRequest(bitmap_widget, LineRequest, True, Plain);
break;
case Rectangle:
BWRemoveAllRequests(bitmap_widget);
BWEngageRequest(bitmap_widget, RectangleRequest, True, Plain);
break;
case FilledRectangle:
BWRemoveAllRequests(bitmap_widget);
BWEngageRequest(bitmap_widget, FilledRectangleRequest, True, Plain);
break;
case Circle:
BWRemoveAllRequests(bitmap_widget);
BWEngageRequest(bitmap_widget, CircleRequest, True, Plain);
break;
case FilledCircle:
BWRemoveAllRequests(bitmap_widget);
BWEngageRequest(bitmap_widget, FilledCircleRequest, True, Plain);
break;
case FloodFill:
BWRemoveAllRequests(bitmap_widget);
BWEngageRequest(bitmap_widget, FloodFillRequest, True, Plain);
break;
case SetHotSpot:
BWRemoveAllRequests(bitmap_widget);
BWEngageRequest(bitmap_widget, HotSpotRequest, True, Plain);
break;
case ClearHotSpot:
BWStoreToBuffer(bitmap_widget);
BWClearHotSpot(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case Undo:
BWUndo(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
break;
case Quit:
DoQuit();
break;
} /* don't add anything below this line */
}
/* ARGSUSED */
void SwitchImage()
{
if (image_visible) {
XtPopdown(image_shell);
image_visible = False;
}
else {
Position image_x, image_y;
int n;
Arg wargs[3];
XtTranslateCoords(bitmap_widget,
10, 10, &image_x, &image_y);
n = 0;
XtSetArg(wargs[n], XtNx, image_x); n++;
XtSetArg(wargs[n], XtNy, image_y); n++;
XtSetValues(image_shell, wargs, n);
image_visible = True;
FixImage();
XtPopup(image_shell, XtGrabNone);
FixImage();
}
}
void SwitchGrid()
{
BWSwitchGrid(bitmap_widget);
}
void SwitchDashed()
{
BWSwitchDashed(bitmap_widget);
}
void SwitchAxes()
{
BWSwitchAxes(bitmap_widget);
}
void SwitchStippled()
{
BWSwitchStippled(bitmap_widget);
}
void SwitchProportional()
{
BWSwitchProportional(bitmap_widget);
}
void SwitchZoom()
{
if (BWQueryZooming(bitmap_widget)) {
BWZoomOut(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
}
else {
if (BWQueryMarked(bitmap_widget)) {
BWStoreToBuffer(bitmap_widget);
BWZoomMarked(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
}
else {
BWEngageRequest(bitmap_widget, ZoomInRequest, False, Plain);
}
}
}
void DoCut()
{
BWStore(bitmap_widget);
BWStoreToBuffer(bitmap_widget);
BWClearMarked(bitmap_widget);
BWUnmark(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
}
void DoCopy()
{
BWStore(bitmap_widget);
BWUnmark(bitmap_widget);
}
void DoPaste()
{
BWRequestSelection(bitmap_widget, btime, TRUE);
BWEngageRequest(bitmap_widget, RestoreRequest, False, Plain);
}
void DoNew()
{
BWGetFilename(bitmap_widget, &filename);
if (PopupDialog(input_dialog, "New file:",
filename, &filename, XtGrabExclusive) == Okay) {
BWChangeFilename(bitmap_widget, filename);
BWChangeBasename(bitmap_widget, filename);
BWStoreToBuffer(bitmap_widget);
BWClear(bitmap_widget);
BWClearHotSpot(bitmap_widget);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWClearChanged(bitmap_widget);
BWUnmark(bitmap_widget);
FixStatus();
}
}
void DoLoad()
{
if (BWQueryChanged(bitmap_widget)) {
BWGetFilename(bitmap_widget, &filename);
RetryLoadSave:
switch (PopupDialog(qsave_dialog, "Save file before loading?",
filename, &filename, XtGrabExclusive)) {
case Yes:
if (BWWriteFile(bitmap_widget, filename, NULL)
!= BitmapSuccess) {
sprintf(message, "Can't write file: %s", filename);
if (PopupDialog(error_dialog, message,
NULL, NULL, XtGrabExclusive) == Retry)
goto RetryLoadSave;
}
break;
case Cancel:
return;
}
}
BWGetFilepath(bitmap_widget, &filename);
RetryLoad:
if (PopupDialog(input_dialog, "Load file:",
filename, &filename, XtGrabExclusive) == Okay) {
if (BWReadFile(bitmap_widget, filename, NULL) != BitmapSuccess) {
sprintf(message, "Can't read file: %s", filename);
if (PopupDialog(error_dialog, message,
NULL, NULL, XtGrabExclusive) == Retry)
goto RetryLoad;
}
else {
BWChangeNotify(bitmap_widget, NULL, NULL);
BWClearChanged(bitmap_widget);
FixStatus();
}
}
}
void DoInsert()
{
BWGetFilepath(bitmap_widget, &filename);
RetryInsert:
if (PopupDialog(input_dialog, "Insert file:",
filename, &filename, XtGrabExclusive) == Okay) {
if (BWStoreFile(bitmap_widget, filename, NULL) != BitmapSuccess) {
sprintf(message, "Can't read file: %s", filename);
if (PopupDialog(error_dialog, message,
NULL, NULL, XtGrabExclusive) == Retry)
goto RetryInsert;
}
else {
BWEngageRequest(bitmap_widget, RestoreRequest, False, Plain);
}
}
}
void DoSave()
{
BWGetFilename(bitmap_widget, &filename);
if (!strcmp(filename, ""))
DoSaveAs();
else if (BWWriteFile(bitmap_widget, NULL, NULL) != BitmapSuccess) {
sprintf(message, "Can't write file: %s", filename);
if (PopupDialog(error_dialog, message,
NULL, NULL, XtGrabExclusive) == Retry)
DoSaveAs();
}
else {
BWClearChanged(bitmap_widget);
}
}
void DoSaveAs()
{
BWGetFilename(bitmap_widget, &filename);
RetrySave:
if (PopupDialog(input_dialog, "Save file:",
filename, &filename, XtGrabExclusive) == Okay) {
if (BWWriteFile(bitmap_widget, filename, NULL) != BitmapSuccess) {
sprintf(message, "Can't write file: %s", filename);
if (PopupDialog(error_dialog, message,
NULL, NULL, XtGrabExclusive) == Retry)
goto RetrySave;
}
else {
BWClearChanged(bitmap_widget);
FixStatus();
}
}
}
void DoResize()
{
Dimension width, height;
format = "";
RetryResize:
if (PopupDialog(input_dialog, "Resize to WIDTHxHEIGHT:",
format, &format, XtGrabExclusive) == Okay) {
if (BWParseSize(format, &width, &height)) {
BWResize(bitmap_widget, width, height);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
FixStatus();
}
else {
sprintf(message, "Wrong format: %s", format);
if (PopupDialog(error_dialog, message,
NULL, NULL, XtGrabExclusive) == Retry)
goto RetryResize;
}
}
}
void DoRescale()
{
Dimension width, height;
format = "";
RetryRescale:
if (PopupDialog(input_dialog, "Rescale to WIDTHxHEIGHT:",
format, &format, XtGrabExclusive) == Okay) {
if (BWParseSize(format, &width, &height)) {
BWRescale(bitmap_widget, width, height);
BWChangeNotify(bitmap_widget, NULL, NULL);
BWSetChanged(bitmap_widget);
FixStatus();
}
else {
sprintf(message, "Wrong format: %s", format);
if (PopupDialog(error_dialog, message,
NULL, NULL, XtGrabExclusive) == Retry)
goto RetryRescale;
}
}
}
void DoFilename()
{
BWGetFilename(bitmap_widget, &filename);
if (PopupDialog(input_dialog, "Change filename:",
filename, &filename, XtGrabExclusive) == Okay) {
BWChangeFilename(bitmap_widget, filename);
FixStatus();
}
}
void DoBasename()
{
BWGetBasename(bitmap_widget, &basename);
if (PopupDialog(input_dialog, "Change basename:",
basename, &basename, XtGrabExclusive) == Okay) {
BWChangeBasename(bitmap_widget, basename);
FixStatus();
}
}
void DoQuit(w) /* ARGSUSED */
Widget w;
{
if (BWQueryChanged(bitmap_widget)) {
BWGetFilename(bitmap_widget, &filename);
RetryQuit:
switch (PopupDialog(qsave_dialog, "Save file before quitting?",
filename, &filename, XtGrabExclusive)) {
case Yes:
if (BWWriteFile(bitmap_widget, filename, NULL)
!= BitmapSuccess) {
sprintf(message, "Can't write file: %s", filename);
if (PopupDialog(error_dialog, message,
NULL, NULL, XtGrabExclusive) == Retry)
goto RetryQuit;
else return;
}
break;
case Cancel:
return;
}
}
exit(0);
}
void main(argc, argv)
int argc;
char *argv[];
{
int i, n;
Arg wargs[2];
Widget w;
Widget radio_group; caddr_t radio_data;
top_widget = XtInitialize(NULL, "Bitmap",
options, XtNumber(options), &argc, argv);
if (argc > 2) {
fprintf(stderr, usage);
exit (0);
}
check_mark = XCreateBitmapFromData(XtDisplay(top_widget),
RootWindowOfScreen(XtScreen(top_widget)),
(char *) xlogo16_bits,
xlogo16_width,
xlogo16_height);
XtAddActions(actions_table, XtNumber(actions_table));
XtOverrideTranslations
(top_widget,
XtParseTranslationTable("<Message>WM_PROTOCOLS: do-quit()"));
parent_widget = XtCreateManagedWidget("parent", panedWidgetClass,
top_widget, NULL, 0);
formy_widget = XtCreateManagedWidget("formy", formWidgetClass,
parent_widget, NULL, 0);
fileMenu_widget = XtCreatePopupShell("fileMenu",
simpleMenuWidgetClass,
formy_widget, NULL, 0);
fileButton_widget = XtCreateManagedWidget("fileButton",
menuButtonWidgetClass,
formy_widget, NULL, 0);
for (i = 0; i < XtNumber(file_menu); i++) {
w = XtCreateManagedWidget(file_menu[i].name,
(file_menu[i].trap ?
smeBSBObjectClass : smeLineObjectClass),
fileMenu_widget, NULL, 0),
XtAddCallback(w,
XtNcallback,
TheCallback,
(XtPointer)&file_menu[i].id);
file_menu[i].widget = w;
}
editMenu_widget = XtCreatePopupShell("editMenu",
simpleMenuWidgetClass,
formy_widget, NULL, 0);
editButton_widget = XtCreateManagedWidget("editButton",
menuButtonWidgetClass,
formy_widget, NULL, 0);
for (i = 0; i < XtNumber(edit_menu); i++) {
w = XtCreateManagedWidget(edit_menu[i].name,
(edit_menu[i].trap ?
smeBSBObjectClass : smeLineObjectClass),
editMenu_widget, NULL, 0),
XtAddCallback(w,
XtNcallback,
TheCallback,
(XtPointer)&edit_menu[i].id);
edit_menu[i].widget = w;
}
status_widget = XtCreateManagedWidget("status", labelWidgetClass,
formy_widget, NULL, 0);
pane_widget = XtCreateManagedWidget("pane", panedWidgetClass,
parent_widget, NULL, 0);
form_widget = XtCreateManagedWidget("form", formWidgetClass,
pane_widget, NULL, 0);
for (i = 0; i < XtNumber(buttons); i++) {
w = XtCreateManagedWidget(buttons[i].name,
(buttons[i].trap ?
toggleWidgetClass : commandWidgetClass),
form_widget, NULL, 0);
XtAddCallback(w,
XtNcallback,
TheCallback,
(XtPointer)&buttons[i].id);
buttons[i].widget = w;
if (buttons[i].id == Point) {
radio_group = buttons[i].widget;
radio_data = buttons[i].name;
}
}
bitmap_widget = XtCreateManagedWidget("bitmap", bitmapWidgetClass,
pane_widget, NULL, 0);
XtRealizeWidget(top_widget);
if (argc > 1)
if (BWReadFile(bitmap_widget, argv[1], NULL))
wm_delete_window = XInternAtom(XtDisplay(top_widget), "WM_DELETE_WINDOW",
False);
(void) XSetWMProtocols (XtDisplay(top_widget), XtWindow(top_widget),
&wm_delete_window, 1);
image_shell = XtCreatePopupShell("image", transientShellWidgetClass,
top_widget, NULL, 0);
box_widget = XtCreateManagedWidget("box", boxWidgetClass,
image_shell, NULL, 0);
normal_image_widget = XtCreateManagedWidget("normalImage",
labelWidgetClass,
box_widget, NULL, 0);
inverted_image_widget = XtCreateManagedWidget("invertedImage",
labelWidgetClass,
box_widget, NULL, 0);
n=0;
XtSetArg(wargs[n], XtNbitmap, BWGetUnzoomedPixmap(bitmap_widget)); n++;
XtSetValues(normal_image_widget, wargs, n);
XtSetValues(inverted_image_widget, wargs, n);
XtRealizeWidget(image_shell);
BWNotify(bitmap_widget, FixUp);
FixStatus();
input_dialog = CreateDialog(top_widget, "input", Okay | Cancel);
error_dialog = CreateDialog(top_widget, "error", Abort | Retry);
qsave_dialog = CreateDialog(top_widget, "qsave", Yes | No | Cancel);
XawToggleSetCurrent(radio_group, radio_data);
BWEngageRequest(bitmap_widget, PointRequest, True, Plain);
XtMainLoop();
}